.TITLE DRSED .IDENT /09.10/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; D. N. CUTLER 2-SEP-73 ; ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ; ; J. M. LAWLER ; B. S. MCCARTHY ; ; MODIFIED BY: ; ; B. S. MCCARTHY 23-MAY-82 09.01 ; ; BM255 -- ADD G$$GEF CONDITIONALS FOR P/OS ; ; M. PETTENGILL 1-JUN-82 09.02 ; MLP901 -- CORRECT BM255 CONDITIONALS IN WTLO CODE ; ; J. R. KAUFFMAN 17-OCT-82 09.03 ; ; JRK263 -- MOVE MORE CODE TO DIRECTIVE COMMONS ; ; J. M. LAWLER 20-OCT-82 09.04 ; ; JL137 -- FIX BUG WHICH CALCULATED EF MASK WORD ; INCORRECTLY ; ; SIGNIFICANT EVENT AND EVENT FLAG DIRECTIVES ; ; MACRO LIBRARY CALLS ; .MCALL HDRDF$,TCBDF$ HDRDF$ ;DEFINE TASK HEADER OFFSETS TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS ;+ ; **-$DRREF-READ EVENT FLAG ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO READ AN EVENT FLAG AND ; REPORT ITS POLARITY. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(37.),DPB SIZE(2.). ; WD. 01 -- EVENT FLAG NUMBER OF FLAG TO BE READ. ; ; INPUTS: ; ; R0=EVENT FLAG MASK WORD. ; R1=EVENT FLAG MASK ADDRESS. ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 WITH A DIRECTIVE STATUS OF 'D.RS00' IF THE FLAG WAS ; CLEAR OR 'D.RS22' IF THE FLAG WAS SET. ;- .ENABL LSB $DRREF::BIT R0,(R1) ;TEST FLAG BNE 10$ ;IF NE FLAG IS SET DRSTS D.RS00 ;SET DIRECTIVE STATUS ;+ ; **-$DRCEF-CLEAR EVENT FLAG ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CLEAR AN EVENT FLAG AND ; REPORT ITS POLARITY BEFORE CLEARING. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(31.),DPB SIZE(2.). ; WD. 01 -- EVENT FLAG NUMBER OF FLAG TO BE CLEARED. ; ; INPUTS: ; ; R0=EVENT FLAG MASK WORD. ; R1=EVENT FLAG MASK ADDRESS. ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 WITH A DIRECTIVE STATUS OF 'D.RS00' IF THE FLAG WAS ; CLEAR OR 'D.RS22' IF THE FLAG WAS SET. ;- $DRCEF::BIT R0,(R1) ;TEST FLAG BEQ 20$ ;IF EQ FLAG IS CLEAR BIC R0,(R1) ;CLEAR FLAG 10$: DRSTS D.RS22 ;SET DIRECTIVE STATUS ;+ ; **-$DRRAF-READ ALL EVENT FLAGS ; **-$DRREF-READ EXTENDED EVENT FLAGS ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO FILL A FOUR (OR SIX) WORD ; BUFFER WITH THE TASK LOCAL AND COMMON EVENT FLAGS (AND GROUP ; GLOBAL FLAGS). ; ; DPB FORMAT: ; ; WD. 00 -- DIC(39.),DPB SIZE(2. OR 3.). ; WD. 01 -- ADDRESS OF A FOUR (OR SIX) WORD BUFFER. ; ; BUFFER FORMAT: ; ; WD. 00 -- TASK LOCAL EVENT FLAGS 1-16. ; WD. 01 -- TASK LOCAL EVENT FLAGS 17-32. ; WD. 02 -- COMMON EVENT FLAGS 33-48. ; WD. 03 -- COMMON EVENT FLAGS 49-64. ; WD. 04 -- GROUP GLOBAL EVENT FLAGS 65.-80. ; WD. 05 -- GROUP GLOBAL EVENT FLAGS 81.-96. ; ; INPUTS: ; ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE BUFFER ADDRESS IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED IF SUCCESSFUL ; DIRECTIVE STATUS OF 'D.RS00' IS RETURNED IF ; GROUP GLOBAL EVENT FLAGS DO NOT EXIST ; FOR THIS TASK'S GROUP. IN THIS CASE ; THE LOCAL AND COMMON EVENT FLAGS ARE ; RETURNED AND THE GROUP GLOBAL FLAGS ; ARE ZERO. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF BUFFER IS ; OUTSIDE OF ISSUING TASK'S ADDRESS SPACE. ;- $DRRAF::MOV (R3),R3 ;GET ADDRESS OF EVENT FLAG BUFFER MOV #4*2,R1 ;SET LENGTH OF BUFFER IN BYTES .IF DF X$$HDR&G$$GEF MOVB H.CUIC+1(R4),-(SP) ;SAVE BYTE FROM HEADER .ENDC ; DF X$$HDR&G$$GEF MOVB $DICSV+1,R4 ;GET DPB SIZE CMPB R4,#2. ;READ ALL EVENT FLAGS DIRECTIVE? BEQ 16$ ;IF EQ YES CMPB R4,#3. ;READ EXTENDED EVENT FLAGS? BNE 18$ ;IF NE NO CMP (R1)+,(R1)+ ;ADD 4 TO BUFFER SIZE 16$: CALL $ACHKP ;ADDRESS CHECK USER BUFFER MOV T.EFLG(R5),(R3)+ ;INSERT LOCAL FLAGS 1-16 MOV T.EFLG+2(R5),(R3)+ ;INSERT LOCAL FLAGS 17-32 MOV $COMEF,(R3)+ ;INSERT COMMON FLAGS 33-48 MOV $COMEF+2,(R3)+ ;INSERT COMMON FLAGS 49-64 CMPB R4,#2. ;EXTENDED FLAGS DIRECTIVE? BEQ 17$ ;IF EQ NO CLR (R3)+ ;INITIALIZE GROUP GLOBAL FLAGS CLR (R3) ; .IF DF G$$GEF .IF DF X$$HDR MOVB (SP),R4 ;RELOAD GROUP CODE FROM HEADER .IFF MOV $HEADR,R4 ;GET TASK HEADER ADDRESS MOVB H.CUIC+1(R4),R4 ;GET TASK GROUP NUMBER .ENDC CALL $SRGEF ;SEARCH FOR GROUP GLOBAL EVENT FLAGS BCS 20$ ;IF CS NOT FOUND MOV G.EFLG+2(R1),(R3) ;INSERT GROUP FLAGS 81-96 MOV G.EFLG(R1),-(R3) ;INSERT GROUP FLAGS 65-80 .IFF ; DF G$$GEF BR 20$ ;GROUP GLOBALS NEVER PRESENT .IFTF ; DF G$$GEF 17$: ;REFERENCE LABEL .IFT ; DF G$$GEF .IF DF X$$HDR TST (SP)+ ;CLEAN UP STACK .ENDC .ENDC ; DF G$$GEF RETURN 18$: DRSTS D.RS99 ;INVALID DPB SIZE ;+ ; **-$DRSEF-SET EVENT FLAG ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SET AN EVENT FLAG AND ; REPORT IS POLARITY BEFORE SETTING. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(33.),DPB SIZE(2.). ; WD. 01 -- EVENT FLAG NUMBER OF FLAG TO BE SET. ; ; INPUTS: ; ; R0=EVENT FLAG MASK WORD. ; R1=EVENT FLAG MASK ADDRESS. ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 WITH A DIRECTIVE STATUS OF 'D.RS00' IF THE FLAG WAS ; CLEAR OR 'D.RS22' IF THE FLAG WAS SET. ;- $DRSEF::BIT #T2.SEF,(R2) ;TASK STOPPED FOR EVENT FLAG? BEQ 19$ ;IF EQ NO BIC #T2.STP*2!T2.STP,(R2) ;UNSTOP THE TASK. NOTE THAT THERE IS ;NO NEED TO CALL $NXTSK OR $SETCR ;SINCE THIS IS THE CURRENT TASK. 19$: BIT R0,(R1) ;TEST FLAG BNE 10$ ;IF NE FLAG IS SET BIS R0,(R1) ;SET FLAG 20$: DRSTS D.RS00 ;SET DIRECTIVE STATUS .DSABL LSB ;+ ; **-$DRSTS-STOP FOR SINGLE EVENT FLAG ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO STOP THE ISSUING TASK UNTIL ; A SPECIFIED EVENT FLAG IS SET. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(135.),DPB SIZE(2.). ; WD. 01 -- EVENT FLAG NUMBER OF FLAG TO WAITFOR. ; ; INPUTS: ; ; R0=EVENT FLAG MASK WORD. ; R1=EVENT FLAG MASK ADDRESS. ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE ISSUING ; TASK IS AT AST STATE. ; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN EVENT ; FLAG NUMBER OTHER THAN A LOCAL EVENT FLAG ; NUMBER IS SPECIFIED. ;- .ENABL LSB $DRSTS::CMP -2(R3),#64. ;LOCAL OR COMMON EVENT FLAG ? .IF DF G$$GEF BLOS 5$ ;IF LOS YES CMP -2(R3),#96. ;LEGAL GROUP GLOBAL EVENT FLAG ? BHI 20$ ;IF HI NO MOV R0,-(SP) ;SAVE EVENT FLAG MASK WORD MOV R1,-(SP) ;SAVE EVENT FLAG MASK ADDRESS CALL 30$ ;DOES THIS EVENT FLAG EXIST ? BCS 20$ ;IF CS NO, ILLEGAL EVENT FLAG MOV (SP)+,R1 ;RESTORE EVENT FLAG MASK ADDRESS MOV (SP)+,R0 ;RESTORE EVENT FLAG MASK WORD .IFF ; DF G$$GEF BHI 20$ ;IF HI NO, ILLEGAL EVENT FLAG .IFTF ; DF G$$GEF 5$: TST (R2) ;TASK AT AST STATE ? BMI 10$ ;IF MI YES, CANCEL DIRECTIVE BIS #T2.SEF,(R2) ;SET STOPPED FOR EVENT FLAG BIT JMP $DRWFS ;FINISH STATE PROCESSING 10$: DRSTS D.RS80 ;ISSUING TASK IS AT AST STATE 20$: DRSTS D.RS97 ;ILLEGAL EVENT FLAG NUMBER .IFT ; DF G$$GEF 30$: MOV R4,-(SP) ;SAVE ADDRESS OF TASK HEADER MOVB H.CUIC+1(R4),R4 ;GET TASK'S GROUP NUMBER CALL $SRGEF ;VALIDATE THE GROUP GLOBAL EVENT FLAGS MOV (SP)+,R4 ;RESTORE TASK HEADER ADDRESS RETURN ; .ENDC ; DF G$$GEF ;+ ; **-$DRSTL-STOP FOR LOGICAL OR OF EVENT FLAGS ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO STOP THE ISSUING TASK UNTIL ; ANY OF THE SPECIFIED EVENT FLAGS IS SET. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(137.),DPB SIZE(3.). ; WD. 01 -- EVENT FLAG SET INDICATOR. ; WD. 02 -- EVENT FLAG MASK WORD. ; ; EVENT FLAG SETS: ; ; SET 1 -- EVENT FLAGS 1.-16. LOCAL ; SET 2 -- EVENT FLAGS 17.-32. LOCAL ; SET 3 -- EVENT FLAGS 33.-48. GLOBAL ; SET 4 -- EVENT FLAGS 49.-64. GLOBAL ; SET 5 -- EVENT FLAGS 65.-80. GROUP GLOBAL ; SET 6 -- EVENT FLAGS 81.-96. GROUP GLOBAL ; ; INPUTS: ; ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE SECOND WORD IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE ; ISSUING TASK IS AT AST STATE. ; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN ; ILLEGAL EVENT FLAG SET OR A ZERO EVENT ; FLAG MASK IS SPECIFIED. ;- $DRSTL::TST 2(R3) ;NON-ZERO MASK WORD ? BEQ 20$ ;IF EQ NO, ILLEGAL CMP (R3),#3 ;ARE EVENT FLAGS LOCAL OR GLOBAL ? .IF DF G$$GEF BLOS 40$ ;IF LOS YES CMP (R3),#5 ;LEGAL GROUP GLOBAL EVENT FLAGS ? BHI 20$ ;IF HI NO CALL 30$ ;ARE THESE GROUP GLOBALS DEFINED ? BCS 20$ ;IF CS NO, ILLEGAL .IFF ; DF G$$GEF BHI 20$ ;IF HI NO, ILLEGAL GROUP .ENDC ; DF G$$GEF 40$: TST (R2) ;TASK AT AST STATE ? BMI 10$ ;IF MI,YES - CANCEL DIRECTIVE BIS #T2.SEF,(R2) ;SET STOPPED FOR EVENT FLAG BIT .DSABL LSB ;+ ; **-$DRWFL-WAIT FOR LOGICAL OR OF EVENT FLAGS ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SUSPEND THE EXECUTION OF THE ; ISSUING TASK UNTIL ANY OF THE SPECIFIED EVENT FLAGS IS SET. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(43.),DPB SIZE(3.). ; WD. 01 -- EVENT FLAG SET INDICATOR. ; WD. 02 -- EVENT FLAG MASK WORD. ; ; EVENT FLAG SETS: ; ; SET 0 -- EVENT FLAGS 1.-16. ; SET 1 -- EVENT FLAGS 17.-32. ; SET 2 -- EVENT FLAGS 33.-48. ; SET 3 -- EVENT FLAGS 49.-64. ; SET 4 -- EVENT FLAGS 65.-80. ; SET 5 -- EVENT FLAGS 81.-96. ; ; INPUTS: ; ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE SECOND WORD IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN ; ILLEGAL EVENT FLAG SET OR A ZERO EVENT ; FLAG MASK IS SPECIFIED. ;- $DRWFL::MOV (R3)+,R1 ;GET EVENT FLAG SET .IF DF G$$GEF CMP R1,#5 ;LEGAL SET? .IFF CMP R1,#3 ; LEGAL SET? .ENDC BHI 10$ ;IF HI NO ASL R1 ;CONVERT TO WORD INDEX MOV (R3),R0 ;GET EVENT FLAG MASK WORD BEQ 10$ ;IF EQ NO FLAGS SPECIFIED CMP R1,#3 ;COMMON GLOBAL FLAG SET? BLT 20$ ;IF LT NO .IF DF G$$GEF CMP R1,#7 ;GROUP GLOBAL EVENT FLAG? BLT 5$ ;IF LT NO MOV R4,-(SP) ;SAVE REGISTERS MOV R0,-(SP) ; MOV R1,-(SP) ;SAVE EVENT FLAG SET INDEX MOVB H.CUIC+1(R4),R4 ;GET GROUP NUMBER CALL $SRGEF ;SEARCH FOR GROUP GLOBAL EVENT FLAGS BCS 10$ ;IF CS NOT FOUND ADD (SP)+,R1 ;POINT TO PROPER GROUP GLOBAL EF WORD ADD #G.EFLG-10,R1 ;IN THE GROUP GLOBAL EVENT FLAG BLOCK MOV (SP)+,R0 ;RESTORE REGISTERS MOV (SP)+,R4 ; INC T.GGF(R5) ;INC GRP GLOBAL USE COUNT FOR TASK CMP -2(R3),#4 ;FIRST SIXTEEN GROUP GLOBAL FLAGS? BEQ 3$ ;IF EQ YES INCB G.CNT-(R1) ;INC GROUPS ACCESS COUNT BR 4$ ;JOIN COMMON CODE 3$: INC G.CNT-G.EFLG(R1) ;INC GROUPS ACCESS COUNT 4$: CALLR $DRWS1 ;JOIN COMMON CODE TO SET WFR ON GLOBAL EFN .ENDC ; DF G$$GEF 5$: ADD #$COMEF-4,R1 ;POINT TO PROPER COMMON FLAG WORD BR 30$ ;FINISH UP AS IF SINGLE FLAG 10$: DRSTS D.RS97 ;SET DIRECTIVE STATUS 20$: ADD R5,R1 ;ADD ADDRESS OF TASK TCB ADD #T.EFLG,R1 ;POINT TO PROPER TASK FLAGS WORD 30$: CALLR $DRWFS ;JOIN COMMON CODE TO SET WFR BIT .END